package com.icinfo.cloud.provider.punish.vo;

import com.icinfo.cloud.provider.common.constant.Constant;
import com.icinfo.cloud.provider.common.enums.*;
import com.icinfo.cloud.provider.punish.csource.manage.vo.CaseSourcePartyInfoVo;
import com.icinfo.cloud.provider.punish.ucase.casemain.model.CasePartiesLegalInfo;
import com.icinfo.cloud.provider.punish.ucase.casemain.model.CasePartiesPersonInfo;
import lombok.Data;

import java.util.Map;
import java.util.Objects;

/**
 * @author HKxxx
 * @date 2024/1/10 13:39
 */
@Data
public class AssociatedTaskPartiesVo {

    /**
     * 当事人类型 法人：LEGAL  个人：PERSON
     */
    private PartiesTypeEnum type;

    /**
     * 法人企业单位名称
     */
    private String entName;
    /**
     * 法人企业统一社会信用代码
     */
    private String unicode;
    /**
     * 法人住所/个人住址
     */
    private String entAddress;

    /**
     * 法人姓名
     */
    private String legalName;

    /**
     * 个人/法人证件类型
     */
    private String personCertType;

    /**
     * 法人证件号码
     */
    private String legalCertNo;

    /**
     * 法人单位类型 (1:法人 2:个体工商户 3:其他组织)
     */
    private String entType;
    /**
     * 法人经营地址
     */
    private String businessAddress;

    /**
     * 法人职务
     */
    private String job;

    /**
     * 法人联系电话
     */
    private String entPhone;


/**------------个人字段------------------**/

    /**
     * 个人证件号码
     */
    private String personCertNo;

    /**
     * 个人当事人姓名
     */
    private String personName;
    /**
     * 个人手机号
     */
    private String personMobile;

    /**
     * 个人性别 男 女
     */
    private String sex;

    /**
     * 个人年龄
     */
    private String age;

    /**
     * 个人工作单位
     */
    private String personWorkUnit;

    /**
     * 获取任务类型名称
     *
     * @return 任务类型名称
     */
    public String getTypeName() {
        if (Objects.isNull(type)) {
            return null;
        }
        return type.getDes();
    }


    /**
     * 检查任务-检查对象信息转换
     */
    public static AssociatedTaskPartiesVo convertForCheckTask(ClientVO info) {
        if (CheckLegalEntityTypeEnum.LEGAL_PERSON_ENTITY.getCode().equals(info.getLegalEntityType())) {
            // 转换检查任务的个人身份证与证件号
            Map<String, String> certTypeMap = CheckCertTypeEnum.convertPunishCode(info.getLegalCertType(), info.getLegalEntityCode());
            return structurePerson(certTypeMap.get("certType"), certTypeMap.get("certNo"), info.getLegalEntityName(),
                    info.getAddress(), info.getRelateTel(), CheckGenderEnum.getValueByCode(String.valueOf(info.getGender())), null, null);
        } else if (CheckLegalEntityTypeEnum.LEGAL_ORG_ENTITY.getCode().equals(info.getLegalEntityType())) {
            // 转换检查任务的法人身份证与证件号
            Map<String, String> certTypeMap = CheckCertTypeEnum.convertPunishCode(info.getLegalCertType(), info.getLeRepCertNo());
            return structureLegal(info.getLegalEntityName(), info.getLegalEntityCode(), info.getAddress(), info.getPersonInCharge(),
                    certTypeMap.get("certType"), certTypeMap.get("certNo"), CheckOrgEntityCategoryEnum.getPunishEntTypeByKey(info.getOrgEntityCategory()),
                    info.getOpAddress(), CheckPersonPositionEnum.getNameByCode(info.getPersonPosition()), info.getRelateTel());
        }
        return null;
    }

    /**
     * 案件个人当事人信息转换
     */
    public static AssociatedTaskPartiesVo convertForCasePartiesPerson(CasePartiesPersonInfo info) {
        return structurePerson(info.getCertType(), info.getCertNo(), info.getName(), info.getAddress(),
                info.getMobile(), info.getSex(), info.getAge(), info.getUnitName());
    }

    /**
     * 案件单位当事人信息转换
     */
    public static AssociatedTaskPartiesVo convertForCasePartiesLegal(CasePartiesLegalInfo info) {
        return structureLegal(info.getEntName(), info.getUniscid(), info.getAddress(), info.getLegalName(),
                info.getLegalCertType(), info.getLegalCertNo(), info.getEntType(), info.getAddress(), info.getJob(), info.getPhone());
    }


    /**
     * 案源当事人信息转换
     */
    public static AssociatedTaskPartiesVo convertForCaseSource(CaseSourcePartyInfoVo info) {
        if (Constant.STRING_1.equals(info.getPartyType())) {
            // 构造个人返回参数
            return structurePerson(info.getPartyIdentityType(), info.getPartyIdentityCode(), info.getPartyName(),
                    info.getAddressDetail(), info.getMobile(), info.getPersonSex(), info.getPersonAge(), info.getPersonUnitName());
        } else if (Constant.STRING_2.equals(info.getPartyType())) {
            // 构造法人返回参数
            return structureLegal(info.getPartyName(), info.getPartyIdentityCode(), info.getEntBusinessAddress(), info.getLegalName(),
                    info.getLegalCertType(), info.getLegalCertNo(), info.getEntType(), info.getEntBusinessAddress(), info.getJob(), info.getMobile());
        }
        return null;
    }


    /**
     * 构造单位当事人信息
     *
     * @param partyName          法人单位名称
     * @param unicode            法人统一社会信用代码
     * @param entBusinessAddress 法人住所
     * @param legalName          法人姓名
     * @param legalCertType      法人证件类型
     * @param legalCertNo        法人证件号码
     * @param entType            法人单位类型
     * @param manageAddress      法人经营地址
     * @param job                职务
     * @param mobile             联系电话
     * @return
     */
    private static AssociatedTaskPartiesVo structureLegal(String partyName, String unicode, String entBusinessAddress, String legalName,
                                                          String legalCertType, String legalCertNo, String entType, String manageAddress,
                                                          String job, String mobile) {
        AssociatedTaskPartiesVo vo = new AssociatedTaskPartiesVo();
        vo.setType(PartiesTypeEnum.LEGAL);
        // 法人单位名称
        vo.setEntName(partyName);
        // 法人统一社会信用代码
        vo.setUnicode(unicode);
        // 法人住所
        vo.setEntAddress(entBusinessAddress);
        // 法人姓名
        vo.setLegalName(legalName);
        // 法人证件类型
        vo.setPersonCertType(legalCertType);
        // 法人证件号码
        vo.setLegalCertNo(legalCertNo);
        // 法人单位类型
        vo.setEntType(entType);
        //TODO 经营地址 与住所一致？
        vo.setBusinessAddress(manageAddress);
        // 职务
        vo.setJob(job);
        // 联系电话
        vo.setEntPhone(mobile);
        return vo;
    }

    /**
     * 构造个人当事人信息
     *
     * @param partyIdentityType 个人证件类型
     * @param partyIdentityCode 个人证件号码
     * @param partyName         个人当事人名称
     * @param address           个人住址
     * @param mobile            个人联系电话
     * @param sex               个人性别
     * @param age               个人年龄
     * @param workUnit          个人工作单位
     * @return
     */
    private static AssociatedTaskPartiesVo structurePerson(String partyIdentityType, String partyIdentityCode, String partyName,
                                                           String address, String mobile, String sex, String age, String workUnit) {
        AssociatedTaskPartiesVo vo = new AssociatedTaskPartiesVo();
        vo.setType(PartiesTypeEnum.PERSON);
        // 个人证件类型
        vo.setPersonCertType(partyIdentityType);
        // 个人证件号码
        vo.setPersonCertNo(partyIdentityCode);
        // 个人当事人名称
        vo.setPersonName(partyName);
        // 个人住址
        vo.setEntAddress(address);
        // 个人联系电话
        vo.setPersonMobile(mobile);
        // 个人性别
        vo.setSex(sex);
        // 个人年龄
        vo.setAge(age);
        // 个人工作单位
        vo.setPersonWorkUnit(workUnit);
        return vo;
    }


}
